/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package AdmonHorarios;

import Usuarios.conexion;
import java.util.ArrayList;
import java.util.List;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Miguel
 */
public class AdminCarreras {
    
    //Conexion para la Base de Datos
    private EntityManagerFactory emf = conexion.getInstancia().getEMF();
    private EntityManager em = emf.createEntityManager();
    
    public void filtrarPeriodos(String año, String semestre, ArrayList<Hora> horas){
        horas.clear();
        //Semestre
        Query qr10 = em.createQuery("Select s.idSemestre from Semestre s "
                    + "where s.año='"+año+"-01-01"
                    + "' and s.semestre="+semestre
                    + " and s.anulado=false");
        List<Integer> idSemes =qr10.getResultList();
        
        //Consultas de todos los Periodos no anulados
        Query qr = em.createQuery("select p from Periodo p "
                + "where p.jornadaidJornada.idJornada="+idSemes.get(0)
                + " and p.anulado = false");
        List<Entidades.Periodo> periodos = qr.getResultList();
        Hora periodo;
        for (int i=0; i<periodos.size(); i++){
            periodo = new Hora();
            periodo.setNumPeriodo(periodos.get(i).getIdPeriodo());
            periodo.setHoraInicio(periodos.get(i).getHoraInicio().toString().substring(11, 16));
            periodo.setHoraFin(periodos.get(i).getHoraFin().toString().substring(11, 16));
            //Guardamos cada periodo en un arraylist global "horas"
            horas.add(periodo);
        }
    }
    
    public void filtrarCursosSecciones(ArrayList<Curso> Cursos, String Carrera, String Ciclo, String Jornada
            , String anio, String Semestre){
        Cursos.clear();
        Query qr = em.createQuery("Select c.idCarrera from Carrera c where c.nombre = '"+
                Carrera+"' and c.anulado = false");
        List<Integer> idC =qr.getResultList();
            
        qr = em.createQuery("Select c.idCiclo from Ciclo c where c.numeroCiclo = "+
                Ciclo+" and c.anulado = false");
        List<Integer> idCic =qr.getResultList();
            
        qr = em.createQuery("select a.idAsignacionCicloCarrera from Asignacionciclocarrera a"
                    + " where a.cicloidCiclo.idCiclo = "+idCic.get(0)+" and a.carreraidCarrera.idCarrera = "+idC.get(0));
        List<Integer> idA =qr.getResultList();
        //Info de los Cursos del ciclo:
        Query qr0 = em.createQuery("select c.idCurso from Curso c "
                    + "where c.asignacionCicloCarreraidAsignacionCicloCarrera.idAsignacionCicloCarrera = " + idA.get(0)
                    + " and c.anulado = false");
        List<Integer> idCursos =qr0.getResultList();
        Query qr1 = em.createQuery("select c.nombre from Curso c "
                    + "where c.asignacionCicloCarreraidAsignacionCicloCarrera.idAsignacionCicloCarrera = " + idA.get(0)
                    + " and c.anulado = false");
        List<String> NCursos =qr1.getResultList();
        Query qr2 = em.createQuery("select c.periodosSemanales from Curso c "
                    + "where c.asignacionCicloCarreraidAsignacionCicloCarrera.idAsignacionCicloCarrera = " + idA.get(0)
                    + " and c.anulado = false");
        List<Short> PSemana =qr2.getResultList();
        Query qr3 = em.createQuery("select c.creditospracticos from Curso c "
                    + "where c.asignacionCicloCarreraidAsignacionCicloCarrera.idAsignacionCicloCarrera = " + idA.get(0)
                    + " and c.anulado = false");
        List<Short> CPracticos =qr3.getResultList();
        Query qr4 = em.createQuery("select c.creditosteoricos from Curso c "
                    + "where c.asignacionCicloCarreraidAsignacionCicloCarrera.idAsignacionCicloCarrera = " + idA.get(0)
                    + " and c.anulado = false");
        List<Short> CTeoricos =qr4.getResultList();
        Curso curs;
        for (int i=0; i<NCursos.size(); i++){
            curs = new Curso(NCursos.get(i),PSemana.get(i),Integer.parseInt(Ciclo),
                        1,CPracticos.get(i),CTeoricos.get(i),false,null);
            //Jornada
            Query qr9 = em.createQuery("Select j.idJornada from Jornada j "
                        + "where j.nombre = '"+Jornada
                        + "' and j.anulado = false");
            List<Integer> idJ =qr9.getResultList();
            //Semestre
            Query qr10 = em.createQuery("Select s.idSemestre from Semestre s "
                    + "where s.año='"+anio+"-01-01"
                    + "' and s.semestre="+Semestre
                    + " and s.anulado=false");
            List<Integer> idSemes =qr10.getResultList();
            //Secciones del curso:
            Query qr5 = em.createQuery("Select a.idAsignacionSeccionCurso from Asignacionseccioncurso a "
                        + "where a.cursoidCurso.idCurso = "+idCursos.get(i) 
                        + " and a.semestreidSemestre.idSemestre="+idSemes.get(0)
                        + " and a.jornadaidJornada.idJornada="+idJ.get(0)
                        + " and a.anulado = false");
            List<Integer> idASC =qr5.getResultList();
            for (int j=0; j<idASC.size(); j++){
                //Informacion de cada seccion:
                Query qr6 = em.createQuery("Select a.seccionidSeccion.idSeccion from Asignacionseccioncurso a "
                        + "where a.idAsignacionSeccionCurso = "+idASC.get(j)
                        + " and a.semestreidSemestre.idSemestre="+idSemes.get(0)
                        + " and a.anulado = false"
                        + " and a.jornadaidJornada.idJornada = "+idJ.get(0));
                List<Integer> idSec =qr6.getResultList();
                Query qr7 = em.createQuery("Select s.nombre from Seccion s "
                        + "where s.idSeccion = "+idSec.get(0) + " and s.anulado = false");
                List<String> NSec =qr7.getResultList();
                Query qr8 = em.createQuery("Select a.numeroEstudiantes from Asignacionseccioncurso a "
                        + "where a.idAsignacionSeccionCurso = "+idASC.get(0) 
                        + " and a.semestreidSemestre.idSemestre="+idSemes.get(0)
                        + " and a.anulado = false"
                        + " and a.jornadaidJornada.idJornada = "+idJ.get(0));
                List<Short> Cupo =qr8.getResultList();
                Seccion sec=new Seccion(idASC.get(j),NSec.get(0),Cupo.get(0),
                            Carrera,
                            Jornada,true);
                curs.setSeccion(sec);
            }
            //Este objeto tiene todos los cursos del ciclo y sus respectivas secciones
            Cursos.add(curs);        
        }
    }
    
    public void buscarCalendario(Calendario calendario, ArrayList<Hora> horas, String Carrera, String Ciclo,
            String Jornada, String anio, String Semestre){
        Query qr = em.createQuery("Select c.idCarrera from Carrera c "
                + "where c.nombre='"+Carrera+"' and c.anulado=false");
        List<Integer> idCarrera =qr.getResultList();
        qr = em.createQuery("Select c.idCiclo from Ciclo c "
                + "where c.numeroCiclo = "+Ciclo+" and c.anulado=false");
        List<Integer> idCiclo =qr.getResultList();
        qr = em.createQuery("Select acc.idAsignacionCicloCarrera from Asignacionciclocarrera acc "
                + "where acc.cicloidCiclo.idCiclo = "+idCiclo.get(0)
                + " and acc.carreraidCarrera.idCarrera="+idCarrera.get(0));
        List<Integer> idACC =qr.getResultList();
        //Para todos los cursos:
        qr = em.createQuery("Select cu from Curso cu where "
                + "cu.asignacionCicloCarreraidAsignacionCicloCarrera.idAsignacionCicloCarrera="+idACC.get(0)
                + " and cu.anulado=false");
        List<Entidades.Curso> Curso =qr.getResultList();
        //Jornada
        Query qr9 = em.createQuery("Select j.idJornada from Jornada j "
                        + "where j.nombre = '"+Jornada
                        + "' and j.anulado = false");
        List<Integer> idJ =qr9.getResultList();
        //Semestre
        Query qr10 = em.createQuery("Select s.idSemestre from Semestre s "
                    + "where s.año='"+anio+"-01-01"
                    + "' and s.semestre="+Semestre
                    + " and s.anulado=false");
        List<Integer> idSemes =qr10.getResultList();
        //Todos los cursos del ciclo
        for (int i=0; i<Curso.size(); i++){
            //Todas las Secciones del Curso:
            qr = em.createQuery("Select secc from Asignacionseccioncurso secc "
                + "where secc.cursoidCurso.idCurso="+Curso.get(i).getIdCurso()
                + " and secc.semestreidSemestre.idSemestre="+idSemes.get(0)
                + " and secc.jornadaidJornada.idJornada="+idJ.get(0)
                + " and secc.anulado=false");
            List<Entidades.Asignacionseccioncurso> Sec = qr.getResultList();
            for (int j=0; j<Sec.size(); j++){
                qr = em.createQuery("Select hc from Horariocurso hc "
                        + "where hc.asignacionSeccionCursoidAsignacionSeccionCurso.idAsignacionSeccionCurso = "+Sec.get(j).getIdAsignacionSeccionCurso()
                        + " and hc.anulado = false");
                List<Entidades.Horariocurso> HorCurso =qr.getResultList();
                if (HorCurso.size()>0){
                    for (int m=0; m<HorCurso.size(); m++){
                        Entidades.Aula au = HorCurso.get(m).getAulaidAula();
                        Aula aula = new Aula(au.getIdAula(),"Central",au.getNombre(),
                            au.getCapacidad(),false);
                        String d = HorCurso.get(m).getDia();
                        int dia=0;
                        if (d.equals("Lunes")){
                            dia=0;
                        }
                        if (d.equals("Martes")){
                            dia=1;
                        }
                        if (d.equals("Miércoles")){
                            dia=2;
                        }
                        if (d.equals("Jueves")){
                            dia=3;
                        }
                        if (d.equals("Viernes")){
                            dia=4;
                        }
                        if (d.equals("Sábado")){
                            dia=5;
                        }
                        //Catedratico
                        Entidades.Catedratico cat = Sec.get(j).getCatedraticoidCatedratico();
                        Catedratico catedratico = new Catedratico();
                        if (cat!=null){
                            catedratico.setNombres(cat.getNombre());
                            catedratico.setApellidos(cat.getApellidos());
                            catedratico.setCreditos(cat.getCreditos());
                            catedratico.setIdCatedratico(cat.getNumeroCatedratico());
                        }
                        //Seccion
                        Seccion seccion = new Seccion();
                        seccion.setAsignado();
                        seccion.setCupo(Sec.get(j).getNumeroEstudiantes());
                        seccion.setIdS(Sec.get(j).getIdAsignacionSeccionCurso());
                        seccion.setNumero(Sec.get(j).getSeccionidSeccion().getNombre());
                        seccion.setJornada(Sec.get(j).getJornadaidJornada().getNombre());
                        /////////////////////
                        qr = em.createQuery("Select apc from Asignacionperiodocurso apc "
                            + "where apc.horarioCursoidHorarioCurso.idHorarioCurso="+HorCurso.get(m).getIdHorarioCurso());
                        List<Entidades.Asignacionperiodocurso> APC =qr.getResultList();
                        for (int k=0; k<APC.size(); k++){
                            Propuesta propuesta = new Propuesta();
                            propuesta.setAula(aula);
                            if (cat!=null){
                                propuesta.setCatedratico(catedratico);
                            }else{
                                propuesta.setCatedratico(null);
                            }
                            propuesta.setCurso(Curso.get(i).getNombre());
                            propuesta.setSeccion(seccion);
                            qr = em.createQuery("Select p from Periodo p "
                                + "where p.idPeriodo="+APC.get(k).getPeriodoidPeriodo().getIdPeriodo());
                            List<Entidades.Periodo> Per =qr.getResultList();
                            int fila=0;
                            for (int l=0; l<horas.size(); l++){
                                if (horas.get(l).getNumPeriodo()==Per.get(0).getIdPeriodo()){
                                    fila = l;
                                }
                            }
                            calendario.getEnlace(fila).getPeriodo(dia).setPropuesta(propuesta);
                        }
                    }
                }
            }
        }
    }
    
    public ObservableList<String> obtenerCarreras(){
        //Filtra todas las carreras
        Query qr = em.createQuery("SELECT f.idFacultad FROM Facultad f WHERE f.nombre ='"+
                "ingenieria' and f.anulado = false");
        List<Integer> idF =qr.getResultList();

        qr = em.createQuery("select c.nombre from Carrera c where c.facultadidFacultad.idFacultad = "
                +String.valueOf(idF.get(0))+" and c.anulado = false");
        List<String> Carr =qr.getResultList();
        ObservableList<String> Carreras = FXCollections.observableArrayList();
        for (int i=0; i<Carr.size(); i++){
            Carreras.add(Carr.get(i));
        }
        return Carreras;
    }
    
    public ObservableList<String> obtenerCiclos(String Carrera){
        ObservableList<String> Ciclos = FXCollections.observableArrayList();
        //Filtra todos los ciclos de una carrera seleccionada
        Query qr = em.createQuery("Select c.idCarrera from Carrera c where c.nombre = '"+
                Carrera+"' and c.anulado = false");
        List<Integer> idC =qr.getResultList();
        
        qr = em.createQuery("Select a from Asignacionciclocarrera a where a.carreraidCarrera.idCarrera = "+
                idC.get(0).toString());
        List<Entidades.Asignacionciclocarrera> ACC =qr.getResultList();
        
        List<Integer> numC;
        for (int i=0; i<ACC.size(); i++){
            int idCiclo = ACC.get(i).getCicloidCiclo().getIdCiclo();
            qr = em.createQuery("Select c.numeroCiclo from Ciclo c where c.idCiclo = "+
                idCiclo + " and c.anulado = false");
            numC =qr.getResultList();
            Ciclos.add(String.valueOf(numC.get(0)));
        }
        return Ciclos;
    }
    
    public ObservableList<String> obtenerJornadas(){
        ObservableList<String> Jornadas = FXCollections.observableArrayList();
        //Filtra todas las jornadas independientemente
        Query qr = em.createQuery("select j.nombre from Jornada j where j.anulado = false");
        List<String> jor =qr.getResultList();
        for (int i=0; i<jor.size(); i++){
            Jornadas.add(jor.get(i));
        }
        return Jornadas;
    }
    
    public ObservableList<String> obtenerSemestres(){
        ObservableList<String> Semestres = FXCollections.observableArrayList();
        //Filtra todas las jornadas independientemente
        Query qr = em.createQuery("Select s from Semestre s where s.anulado = false");
        List<Entidades.Semestre> Semes =qr.getResultList();
        for (int i=0; i<Semes.size(); i++){
            Semestres.add(Semes.get(i).getAño().toString().substring(24)
                    +" - Semestre:"+Semes.get(i).getSemestre());
        }
        return Semestres;
    }
    
}
